package com.saver.modules.sys.controller;

import com.saver.common.utils.R;
import org.hyperic.sigar.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;

@RestController
@RequestMapping("/sys/monitor")
public class SysMonitorController {

    @GetMapping("/info")
    public R info() throws SigarException, UnknownHostException {
        Map<String, Object> memMap = new LinkedHashMap<>();
        Sigar sigar = new Sigar();
        Mem mem = sigar.getMem();
        // 内存总量
        memMap.put("memTotal", mem.getTotal() / 1024L);
        // 当前内存使用量
        memMap.put("memUsed", mem.getUsed() / 1024L);
        // 当前内存剩余量
        memMap.put("memFree", mem.getFree() / 1024L);
        Swap swap = sigar.getSwap();
        // 交换区总量
        memMap.put("swapTotal", swap.getTotal() / 1024L);
        // 当前交换区使用量
        memMap.put("swapUsed", swap.getUsed() / 1024L);
        // 当前交换区剩余量
        memMap.put("swapFree", swap.getFree() / 1024L);
        Runtime r = Runtime.getRuntime();
        memMap.put("jvmTotal", r.totalMemory());
        memMap.put("jvmFree", r.freeMemory());
        memMap.put("jvmUsed", r.totalMemory() - r.freeMemory());

        Properties props = System.getProperties();

        Map<String, String> map = System.getenv();
        String userName = map.get("USERNAME");// 获取用户名
        String computerName = map.get("COMPUTERNAME");// 获取计算机名
        String userDomain = map.get("USERDOMAIN");// 获取计算机域名

        CpuInfo infos[] = sigar.getCpuInfoList();
        CpuPerc cList[] = sigar.getCpuPercList();
        List<Map<String, Object>> cpuList = new ArrayList<>();
        for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
            CpuInfo info = infos[i];
            Map<String, Object> m = new LinkedHashMap<>();
            m.put("CPU生产商:", info.getVendor());// 获得CPU的卖主，如：Intel
            m.put("CPU类别:", info.getModel());// 获得CPU的类别，如：Celeron
            m.put("CPU的总量MHz:", info.getMhz());// CPU的总量MHz
            m.put("CPU当前空闲率:", CpuPerc.format(cList[i].getIdle()));// 当前空闲率
            m.put("CPU总的使用率:", CpuPerc.format(cList[i].getCombined()));// 总的使用率
            cpuList.add(m);
        }

        List<Map<String, Object>> computer = new ArrayList<>();

        Map<String, Object> a = new LinkedHashMap<>();

        a.put("用户名:    ", userName);
        a.put("计算机名:    ", computerName);
        computer.add(a);
        Map<String, Object> b = new LinkedHashMap<>();
        b.put("计算机域名:    ", userDomain);

        computer.add(b);
        Map<String, Object> c = new LinkedHashMap<>();
        c.put("Java的安装路径：    ", props.getProperty("java.home"));
        computer.add(c);

        Map<String, Object> d = new LinkedHashMap<>();
        d.put("操作系统的名称：    ", props.getProperty("os.name"));
        d.put("操作系统的构架：    ", props.getProperty("os.arch"));
        computer.add(d);
        Map<String, Object> e = new LinkedHashMap<>();
        e.put("JVM可以使用的处理器个数:    ", r.availableProcessors());
        e.put("Java的运行环境版本：    ", props.getProperty("java.version"));
        computer.add(e);
        Map<String, Object> f = new LinkedHashMap<>();
        f.put("当前工作目录：", props.getProperty("user.dir"));
        computer.add(f);

        List<Map<String, Object>> list = new ArrayList<>();
        FileSystem fslist[] = sigar.getFileSystemList();
        for (int i = 0; i < fslist.length; i++) {
            FileSystem fs = fslist[i];
            Map<String, Object> maps = new LinkedHashMap<>();

            // 分区的盘符名称
            maps.put("分区的盘符:", fs.getDevName());

            // 文件系统类型，比如 FAT32、NTFS
            maps.put("文件系统类型:", fs.getSysTypeName());

            FileSystemUsage usage = sigar.getFileSystemUsage(fs.getDirName());

            maps.put("总大小:", usage.getTotal() / 1024 / 1024 + "GB");
            // 文件系统剩余大小
            maps.put("剩余大小:", usage.getFree() / 1024 / 1024 + "GB");

            // 文件系统已经使用量
            maps.put("已使用大小:", usage.getUsed() / 1024 / 1024 + "GB");
            double usePercent = usage.getUsePercent() * 100D;
            // 文件系统资源的利用率
            maps.put("资源的利用率:", usePercent + "%");
            long total = usage.getTotal();
            if (total != 0) {
                list.add(maps);
            }
        }
        return R.ok().put("mem", memMap).put("computer", computer).put("file", list).put("cpuList", cpuList);
    }

}
